{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "7adc301a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 2000x1200 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import talib \n",
    "import numpy as np \n",
    "import psycopg2 as pg \n",
    "import pandas as pd \n",
    "import matplotlib.pyplot as plt \n",
    "import matplotlib.gridspec as gridspec#分割子图 \n",
    "import mplfinance as mpf \n",
    "np.seterr(divide='ignore',invalid='ignore') # 忽略warning\n",
    "plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签 \n",
    "plt.rcParams['axes.unicode_minus']=False #用来正常显示负号 \n",
    "fig = plt.figure(figsize=(20,12), dpi=100,facecolor=\"white\") #创建fig对象"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "dd41f5eb",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "729768d1",
   "metadata": {},
   "outputs": [
    {
     "ename": "SyntaxError",
     "evalue": "EOL while scanning string literal (Temp/ipykernel_18020/441366789.py, line 10)",
     "output_type": "error",
     "traceback": [
      "\u001b[1;36m  File \u001b[1;32m\"C:\\Users\\zhang\\AppData\\Local\\Temp/ipykernel_18020/441366789.py\"\u001b[1;36m, line \u001b[1;32m10\u001b[0m\n\u001b[1;33m    df_stockload = query(\"select trade_date,open,high,low,close,vol from pro_bar\u001b[0m\n\u001b[1;37m                                                                                 ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m EOL while scanning string literal\n"
     ]
    }
   ],
   "source": [
    "# # 加载数据\n",
    "# def query(sql):\n",
    "#     conn = pg.connect(dbname=\"stocks\", user=\"postgres\", password=\"******\", host=\"******\", port=\"5432\")\n",
    "#     data = pd.read_sql(sql,conn)\n",
    "#     conn.close()\n",
    "#     return data\n",
    "\n",
    "# ts_code = '000001.SZ' #股票代码\n",
    "# name = '平安银行'\n",
    "# df_stockload = query(\"select trade_date,open,high,low,close,vol from pro_bar \n",
    "#                       where ts_code = '{}' and trade_date>='20190801'\".format(ts_code))\n",
    "# df_stockload['trade_date'] = pd.to_datetime(df_stockload['trade_date'])\n",
    "# df_stockload=df_stockload.set_index('trade_date')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "b00670ca",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 加载数据\n",
    "df = pd.read_excel('C:/Users/zhang/Desktop/4.xlsx',date_parser='trade_date')\n",
    "ts_code = '000001.SZ' #股票代码\n",
    "name = '平安银行'\n",
    "df_stockload= df\n",
    "# df_stockload = query(\"select trade_date,open,high,low,close,vol from pro_bar \n",
    "#                       where ts_code = '{}' and trade_date>='20190801'\".format(ts_code))\n",
    "df_stockload['trade_date'] = pd.to_datetime(df_stockload['trade_date'])\n",
    "df_stockload=df_stockload.set_index('trade_date')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "acf600a3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoQAAAIYCAYAAAD0E/13AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAA9hAAAPYQGoP6dpAABcqElEQVR4nO3deXxU1d3H8e9kGSCAhC0JuLCIgFIFEaWgqICVTSsqUSsaLUFBIlqVPo0r+tQlUrCixg1QxKVIEKUqYtHWpwqIGygKBikgELJAJAKJMFnu80eaYSbJJDNzZ7+f9+vFi+TOnblnflwy35x7zrk2wzAMAQAAwLLiwt0AAAAAhBeBEAAAwOIIhAAAABZHIAQAALA4AiEAAIDFEQgBAAAsjkAIAABgcQRCAAAAiyMQAgAAWFxCuBsARJotW7Zo6dKlWrt2rQoLC3XkyBF16NBBp556qi666CJdeOGFiouL/N+lsrOz9eabb0qSLr30UuXk5EiSdu/erZEjRzr3+/DDD3XccceFpY2SVF1drS1btujkk092237ttdfqs88+kyTdfPPNmj59uqnjjBgxQgUFBZKkRx55RJdddpmp15OkvXv36rHHHtPHH3+ssrIyHXPMMTr55JM1a9YsdezY0fTr+6tPnz4Ntj322GMaN25cg+2ZmZn65JNP3La5ni+uNm7cqKVLl2rdunXau3evjhw5orZt26pXr14aMWKE0tPT1aZNmwbPc619c4499lj985//1JNPPqmnnnrKq+e4Cvf5DEQrAiHwX9XV1Xr00Uf18ssvq6amxu2xoqIiFRUVadWqVTr99NM1d+5cpaamhqmlsePTTz/VQw89pH79+jUaQCJZZWWlrr32Wm3fvt25rbS0VGvXrlXbtm3D2LLGrVu3rkEgrKqq0ldffeXV8x9//HE999xzDf5v/PTTT/rss8/02Wef6aWXXtKzzz6rvn37BqzdAEKDQAhIMgxDt912m95//33ntsTERPXp00fV1dX6z3/+I4fDIUlav369brzxRr3++utq2bJluJoc9R5++GG99NJLkqR+/fo1eLxfv36Kj4+XJB1//PEhbZs3vvnmG7cw2LVrV6WmpqpVq1ay2+1hbFnj1q1b12Dbxo0bVVFR0exz33zzTT3zzDPO71u0aKEePXqoZcuW2rFjh8rKyiRJhYWFmjp1qlasWKGkpKRGX6tz587q1auXx2N16tRJUu2/+ZAhQ9we27t3r7Zu3er8fuDAgWrRooXbPvyfBPxDIAQkvfTSS25hcNy4cbr33nvVvn17SVJJSYnuvfdeffTRR5Kk77//XvPmzTN9GdPKNm/e3OTj2dnZIWqJf4qLi51ft2rVSitWrFCrVq3C2KKm7dixQ8XFxW4923WX5Jvz7LPPOr8ePny4Hn74YXXo0EGS5HA49NBDD2nx4sWSakPh3//+d1111VWNvtY555zjVW/w+PHjNX78eLdty5Yt05133un8/i9/+QuXh4EAifyBUECQ/fLLL269H4MHD9bs2bOdYVCSUlJSNHfuXPXo0cO5LS8vr8HlM1jHkSNHnF936NAhYsNgz549nV/X7yV0DYQnnnhio88/cOCAduzY4fw+PT3dGQYlyW636+6773YbO7hhwwaTrQYQavQQwvI++OAD5yUvScrKymp00kjLli01depUffvttzrrrLN05plnNtjvu+++0wsvvKD169erpKREhmGoXbt26tu3r66++mpdcMEFbvu7DpyfOnWqbr75Zr344otavny5du3apbZt22rYsGGaNm2aTjjhhAZtcjgcWrhwof7+979r586dOuaYYzRixAj94Q9/MFWTVatW6dVXX9V3332nw4cPKy0tTWeffbYyMzMbvXxbUFCgF154QWvXrtWePXvkcDjUtm1bnXTSSRo3bpyuuOIK5+XfdevWKSMjw+35b775pt58803nhAKp+Ukl5eXlevXVV/X+++9rx44dqqmpUdeuXXXGGWdo8uTJjdarMRs2bFBGRoYz4J122ml66aWXPF7ybKz9BQUFzokc9Ses7N69W4sXL9ZHH33knFjRrVs3DR8+XNddd52Sk5PdXst10k9qaqqWLVume+65R2vXrpXdbteoUaP04IMPevXeJGnQoEHatm2bs+2//e1vJbmPH0xKStIpp5yi//znPw2eX/+XnoULF6p///7OS7tSbShcuHChDh48KElugRFAdCAQwvI+//xz59ctW7bUoEGDPO7b2GWsOuvWrdPkyZOdYw3rlJaWavXq1Vq9erVuueUWZWVlNfr8w4cP69prr9X69eud244cOaI333xT//rXv/TGG2+4XR4rLy9XZmam2/579+7V66+/ro8//tivcXeGYWjmzJl6/fXX3bbv3LlTO3fu1PLly/X444/rvPPOcz62adMmZWRkOMNAnbKyMn3++ef6/PPP9eWXX2rWrFkBm529e/duZWZmuvVcSdLWrVu1detWLVu2TI8//niDAF5fQUGBsrKynGGwe/fueu655zyGQV+9++67uueeexqM09u8ebM2b96sxYsX68knn/R4zjkcDk2ePNl5eb0unPti0KBBWrJkiST3HkHX8YMDBgxQQkLjHwfJycnq3r27s9afffaZzj//fA0bNkzDhg3T0KFD1b17d5166qk+tQtAZOGSMSzPdZD6CSec4OzJ8kVVVZVmzJjhDINJSUkaOHCg28QIqXYs1i+//NLoa7z66qtav369kpOTdfrpp6tdu3bOx8rKyvTiiy+67f+Xv/zFLQy2atVKp556qjp06KA9e/Y0OomgOYsWLXILg6mpqRowYIBat24tSaqoqNDtt9+uwsJC5z4PPfSQMwwmJiaqX79+OuOMM9x6vt5++22tWLFCktSuXTsNGTJExxxzjPPxzp07a8iQIRo4cGCzbayurtb06dPdwuBxxx2n/v37KzExUVLtDOD/+Z//0b59+zy+zqFDhzR16lTnPp06ddL8+fOb7d2qa7/rxIgWLVpoyJAhGjJkiFJSUiRJX331lf74xz86Q1d8fLx69+6t7t27y2azSaqdoTtlyhRnD159+/fv1+bNm9W+fXuddtppSkxMbHTpmKakpaXp2GOPlVQb7Ov+7VzPj6Z+CZJqe2hdVVZW6p///KceeOABjRo1SiNHjtRf/vIX7d6926e2AYgcBEJY3s8//+z8urE11LyxZcsWtWnTRvHx8ercubNWrVqlv/3tb1q2bJkWLlzo3M/hcOjHH39s9DUqKyt18cUX69///rcWL16sDz74QN27d3c+vnHjRufXZWVleuONN5zfn3rqqfrwww+1dOlS/fvf/1Z6errP78HhcLhNHsjMzNRHH32k119/Xf/85z+dPUCHDh3SokWLnPt98803zq9XrFihZcuW6bXXXtPHH3+sYcOGqVWrVurXr59KSkokSX379tXChQvdliY555xztHDhQs2ePbvZdr7//vvatGmT8/sHH3xQH374oZYsWaLly5c7l3wpLy93TnSor6amRnfccYe2bNkiqTbAP//88171qta1PzMz07mtU6dOWrhwoRYuXKhzzjlHknT//ferurpaUu3aesuWLdPbb7+t999/XwsXLnQG/kOHDumRRx7xeLzu3bvrgw8+UF5env75z3+6jWP1lmvgqwuCrr2FzQXCiy++WH/4wx+cQba+3bt3a/78+RozZoxeffXVJl/rzTffVJ8+fRr9c+2113r7lgAEGIEQlldVVeX82jAMv17jlFNO0Xvvvaf169frjTfecBtf5doTJtUGgMa0aNFC999/v3MZjWOOOUYXX3yx83HX4Prll1+6XZq+7777nAshJyYm6r777mswNq05X375pX766Sfna/zhD39wXuJNTk7WpEmTnPvWzbaWanv36jzxxBNas2aNjhw5IrvdrtzcXH311VdatmyZ2/PNqBtjKElnnnmmW/g98cQT9ac//UnZ2dlauHChx4Dx3HPPub2Hxx57rNGlb/y1ceNG5efnO7+/66673ALwr3/9a7ehAx9//LHH3syrr77a+YtKXe+jr+oHwsrKSmfvcmJiogYMGNDsa9x000166623dMkll3i8pO5wOPS///u/zt5gANGDMYSwPNdLs/XHwfnKbrersLBQb7/9tr755hvn5BJXdb1G9XXr1q1BD6VrsKysrHR+vWvXLufXLVq0aDB+y263q3///vq///s/r9vueum8srKyyTFh27dvl8PhkN1u1+TJk/XAAw9Iqr00/PbbbysxMVGnnHKKzjrrLF1wwQVeBQ5vuU58+NWvftXgcW96R3fu3On2vadeW3+59mDGx8e7jbmsM2LECD388MOSan8R+e677xrdLxCLPNcPhK7jB3/1q181WMvPk759+2rWrFlyOBz64osvnGNj6y8hNHfuXI0ZM6bRHsWm1iFkQWsgfAiEsLwTTjhBX3/9taTaoFBVVeVxgP1//vMfbd26Veeee26DZUY++OADPfzww2636LLb7Ro4cKBXd4No7HK1pwWOXScptG/fvtEPXl/vluGp57IxhmHowIED6tSpk66++mq1bt1aTz/9tHNcX2Vlpb7++mt9/fXXmjdvnk499VQ9+uijHpc28bedgVqE+JlnntGll17q9suBGa69ue3bt3eObXRVv7fvwIEDjb6Wrz29jenZs6c6duyo0tJSFRQUOG9pKNX2snrj0KFD+uWXX9S5c2fZ7XYNHTpUQ4cO1R//+Efl5+frtttuc4b1HTt2qKCgoNE1Ar1dhxBAaHHJGJbn2ntS1/PhyRtvvKFbbrlFQ4YM0S233OJ295JbbrlFBQUFSkxM1M0336wlS5boyy+/bHZMVR1PIbQxdZM8JM9BoqkJFY1xDbht2rTRV1991eQf13v1XnLJJXr//ff11ltv6Y477tB5553nFmQ2btyoG2+80e3yvL9cg3NjPbreXvZPT09X165dJdWOyXRdi9Is14kp+/fvd+vdreO6sLUkj2E0UKH3jDPOcH7tGgibGz/46KOPasCAATrjjDN05ZVXNrpPnz59Gix1VFpa6n9jAYQcgRCWN2bMGLcxUc8991yjoeKnn37S0qVLJdUuZl1QUODswVuyZInzUvAVV1yh6dOnq3///rLb7dq7d2/A2+y62HBFRUWDS3aHDh1yu2zpDdfJCocOHVJxcbFat27t/LNhwwYtW7ZMGzdu1JEjR2Sz2VRdXa0dO3boww8/1GuvvaaTTz5ZN954o55//nmtXbtW999/v/M1d+/e7TauzpUvYzddexldZ1nXmTVrloYNG6ZJkyZpwYIFjb7GyJEj9b//+7+65ZZbnNteeeUVt0vxZpx00knOr6urqxu9dO86FjIuLs7jJXp/Zr03xjUQ1gXUuLi4Zmd2H3vssc6Z8QUFBVq7dm2j+9U/z13HlgKIfARCWF67du30+9//3vn9mjVr9Kc//cmt52379u268cYb3S4FTp482fm16zjBb775RocPH5ZU24P10EMPuR3P0xhCXwwcONCtl/D+++93Lq7tcDj0wAMPeOw59OTMM890e82ZM2c6X6OsrEz333+/HnzwQV133XXOMYMfffSRRo0apWnTpumBBx5QXl6e8/lxcXENxqa5hhvXy6h1dfUmGI4YMcL59Xfffec2i/vHH3/UG2+8oZKSEq1evdpjL+kFF1yguLg4XXLJJerdu7ek2pD02GOPNXt8b/Tv31/dunVzfv/www/r+++/d36/bt06Pf30087vhw8f7nZnnGBo7NJwnz59mh1aMHr0aLehC9nZ2Q2C+GeffaYnnnjC+X3v3r2dva8AogNjCAHV3p3kq6++cvZ+LF++XCtXrlTfvn1VUVGh7du3u13u/M1vfqMxY8Y4vz/xxBP1ySefSKq9PDpixAidcMIJ2rJli8rLy92OVf97f7Ru3VrXXXedM1Rs2LBBI0aMUO/evbVjxw7t379fcXFxPt1aLykpSZMmTdKTTz4pqfZDfvjw4erVq5e2bdvmDIfx8fGaMmWKJDkfr5uQcs899+jZZ59VWlqa9u7d6zZZo3v37s7wJcktAH300UeaMGGCDh06pJUrVzbZzlGjRunkk0929oo+8sgjeumll9S5c2dt3rzZbS3I5pYxiYuL0+23366pU6dKkt577z39/ve/12mnndZ8wZpx9913a8qUKTIMQwUFBbrssst04oknqrKyUjt27HCG33bt2oXkvs19+/ZV69at3c6/5i4XS7UTm6ZMmeI8L4qKinTVVVfp+OOPV+fOnVVcXOw2btZms+nWW28N/BsAEFT0EAKqDTnPP/+8Lr30Uue2I0eO6Ouvv9YPP/zgFgbHjRunOXPmuD1/0qRJbuPGSktLtX79epWXlysxMdHt8tn27dsD0uZp06bp/PPPd35fXl6u9evXa//+/UpJSdGNN97o82vedNNNbkH30KFD2rBhgzMM2mw2PfjggzrllFMk1QaqefPmORc+lmovDX/xxRduYbB9+/b661//6nanknPPPdf5tWEY2rhxo3P2clPi4+P11FNPua3RuGfPHn399dfO5yYmJurRRx/1qpdq+PDhzmBkGIYeffTRZp/jjfPOO09//vOfnWMzq6urtWXLFm3fvt0ZBjt16qTnn3/e69vsmREfH6/TTz/dbZs3gVCq/YXpuuuuc9u2a9cuffXVV25hMDExUXfddVezd4gBEHkIhMB/2e125eTkaMmSJUpPT1e3bt3UqlUr2e12HXfccbrooou0cOFCPfbYYw0uhaalpWnJkiUaN26cOnTooISEBHXs2FEjR47Uq6++quuvv9657wcffBCQ9iYmJurpp5/W3Xffrd69e8tutys1NVXXXHONli9f3ugMz+bEx8fr8ccf11//+ledc8456tixoxISEtS+fXuNHDlSL7/8stt9eiWpa9eueuutt3TLLbfo1FNPVZs2bRQXF6fWrVurX79+mjp1qt59911niKxzySWXaMaMGTruuOOUmJiojh07avjw4c7byDXluOOO07Jly3TbbbfplFNOUVJSkhITE3Xsscfq8ssv11tvvaULL7zQ6/c9Y8YM59dffPGFVq1a5fVzm5Kenq63335bN9xwg3r37q2kpCQlJSWpb9++uvnmm7VixYqALsnTnPoB0NtAaLPZdNdddykvL09XXnmlevXqpaSkJCUkJKhDhw7q16+fJk+erHfeeafBfZ4BRAeb4e9KvAAAAIgJ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VsKC+plD/cyhfuZQP3Oon/+oXXARCH106NAhZWRkaO/evTpw4ICqq6s1fvx4jRkzRmeffbakoyejJFVXVys+Pl7l5eXatWuXNmzYoM6dO+vkk09W165dw/lWwoL6mUP9zKF+5lA/c6if/6hd8BEIfVBZWampU6equrpaN998szp06KDPPvtMjz/+uLp27arrr79ev/3tbyXVdmXX/ebi+rWVUT9zqJ851M8c6mcO9fMftQsN7mXsg4MHD2r37t2aMmWKBg0aJEnq2bOnunXrpr/85S/O+yNefPHFbidhVVWVKioqlJycHKaWRwbqZw71M4f6mUP9zKF+/qN2oUF09lJNTY3Kysq0c+dOderUSZKc09iHDBmiu+66Sy1bttSLL76otWvXOp/ncDh033336bHHHlNlZWVY2h4JqJ851M8c6mcO9TOH+vmP2oUOgdBLcXFx6tmzpwYMGKB58+Zp3759stvtqq6uliQNGjRIM2bMUHFxsZYvX+48Ye12u+Lj43XFFVdYeuFL6mcO9TOH+plD/cyhfv6jdiEU7FuhRLNffvnFePPNN40XXnjByMvLMxwOh7Fo0SJj5MiRxpNPPmkcPHjQMAzDqKqqcj5n6dKlxsknn2x8/fXX4Wp2xKB+5lA/c6ifOdTPHOrnP2oXHowh9KC8vFxXXXWVHA6H9u/fL6l2raPp06erS5cuWrJkidq2bavLL79cbdq0kcPhkN1u1/Dhw9W2bVtt2rRJp512mtusJyuhfuZQP3OonznUzxzq5z9qFz5cMm5ETU2N7rnnHrVu3VpPPvmkVq5cqRdeeEGpqan685//rGHDhqldu3aaN2+eXnnlFf3000/OVdBLS0vVsmVL5yBWK56Q1M8c6mcO9TOH+plD/fxH7cKLHsJGHD58WHv27NH555+v3r17S5I6dOigF154QbfddpsWLFigyZMn65///KeWLFmiDRs2aNq0aSotLdU//vEPxcXFqX///mF+F+FD/cyhfuZQP3OonznUz3/ULrwIhI1ISEhQeXm5iouLndvqFrn861//qttuu00LFy7UPffcox9//FErV67UFVdcoeTkZLVr107PPPOMunTpEsZ3EF7UzxzqZw71M4f6mUP9/EftwiyM4xcjVlVVlZGdnW2MGzfO+Pbbb53bKysrnV9PmjTJGDt2rFFeXm7U1NQYn3/+ubFlyxZj37594WhyRKF+5lA/c6ifOdTPHOrnP2oXXgRCD7Zs2WL079/fuP32242SkhLn9rpZTfn5+cavf/1r48UXXwxTCyMb9TOH+plD/cyhfuZQP/9Ru/BhUokHJ510kh566CG9//77euKJJ7Rv3z5JUnx8vCSpW7duatWqlXM73FE/c6ifOdTPHOpnDvXzH7ULH8YQNmHs2LE6cOCAHnroIR0+fFg33HCDc6BrWVmZ2rVrpw4dOkgSU9wbQf3MoX7mUD9zqJ851M9/1C48CIRNsNlsuvLKK9WqVSvde++92rp1q84//3ylpKRo7dq12rNnjy644ALnvnBH/cyhfuZQP3OonznUz3/ULjxshmEY4W5ENNi8ebPmzp2r/Px8VVdXq0uXLnrggQfUt2/fcDctKlA/c6ifOdTPHOpnDvXzH7ULHQKhDw4fPqyKigo5HA61adNGbdq0CXeTogr1M4f6mUP9zKF+5lA//1G70CAQAgAAWByzjAEAACyOQAgAAGBxBEIAAACLIxACAABYHIEQAADA4giEAAAAFkcgBAAAsDgCIQAAgMURCAEAACyOQAgAAGBxBEIAAACLIxACAABY3P8DTqKSkpXOaN4AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 800x575 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "mpf.plot(df_stockload, type=\"candle\", title=\"Candlestick for MSFT\", ylabel=\"price($)\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "d673681f",
   "metadata": {},
   "outputs": [],
   "source": [
    "gs = gridspec.GridSpec(4, 1, left=0.08, bottom=0.15, right=0.99, top=0.96, wspace=None, hspace=0, height_ratios=[3.5,1,1,1])\n",
    "graph_KAV = fig.add_subplot(gs[0,:])\n",
    "graph_VOL = fig.add_subplot(gs[1,:])\n",
    "graph_MACD = fig.add_subplot(gs[2,:])\n",
    "graph_KDJ = fig.add_subplot(gs[3,:])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "a1d95bf1",
   "metadata": {},
   "outputs": [
    {
     "ename": "AttributeError",
     "evalue": "module 'mplfinance' has no attribute 'candlestick2_ochl'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mAttributeError\u001b[0m                            Traceback (most recent call last)",
      "\u001b[1;32m~\\AppData\\Local\\Temp/ipykernel_18020/3678388183.py\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      1\u001b[0m \u001b[1;31m#绘制K线图\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m mpf.candlestick2_ochl(graph_KAV, df_stockload.open, df_stockload.close, df_stockload.high, df_stockload.low, width=0.5,\n\u001b[0m\u001b[0;32m      3\u001b[0m                       colorup='r', colordown='g')  # 绘制K线走势\n\u001b[0;32m      4\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      5\u001b[0m \u001b[1;31m#绘制移动平均线图\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mAttributeError\u001b[0m: module 'mplfinance' has no attribute 'candlestick2_ochl'"
     ]
    }
   ],
   "source": [
    "\n",
    "\n",
    "#绘制K线图\n",
    "mpf.candlestick2_ochl(graph_KAV, df_stockload.open, df_stockload.close, df_stockload.high, df_stockload.low, width=0.5,\n",
    "                      colorup='r', colordown='g')  # 绘制K线走势\n",
    "\n",
    "#绘制移动平均线图\n",
    "df_stockload['Ma5'] = df_stockload.close.rolling(window=5).mean()#pd.rolling_mean(df_stockload.close,window=20)\n",
    "df_stockload['Ma10'] = df_stockload.close.rolling(window=10).mean()#pd.rolling_mean(df_stockload.close,window=30)\n",
    "df_stockload['Ma20'] = df_stockload.close.rolling(window=20).mean()#pd.rolling_mean(df_stockload.close,window=60)\n",
    "df_stockload['Ma30'] = df_stockload.close.rolling(window=30).mean()#pd.rolling_mean(df_stockload.close,window=60)\n",
    "df_stockload['Ma60'] = df_stockload.close.rolling(window=60).mean()#pd.rolling_mean(df_stockload.close,window=60)\n",
    "\n",
    "graph_KAV.plot(np.arange(0, len(df_stockload.index)), df_stockload['Ma5'],'black', label='M5',lw=1.0)\n",
    "graph_KAV.plot(np.arange(0, len(df_stockload.index)), df_stockload['Ma10'],'green',label='M10', lw=1.0)\n",
    "graph_KAV.plot(np.arange(0, len(df_stockload.index)), df_stockload['Ma20'],'blue',label='M20', lw=1.0)\n",
    "graph_KAV.plot(np.arange(0, len(df_stockload.index)), df_stockload['Ma30'],'pink', label='M30',lw=1.0)\n",
    "graph_KAV.plot(np.arange(0, len(df_stockload.index)), df_stockload['Ma60'],'yellow',label='M60', lw=1.0)\n",
    "\n",
    "# 添加网格\n",
    "graph_KAV.grid()\n",
    "\n",
    "graph_KAV.legend(loc='best')\n",
    "graph_KAV.set_title(ts_code + ' ' + name)\n",
    "graph_KAV.set_ylabel(u\"价格\")\n",
    "graph_KAV.set_xlim(0, len(df_stockload.index))  # 设置一下x轴的范围"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0470bf9f",
   "metadata": {},
   "outputs": [],
   "source": [
    "#绘制成交量图\n",
    "graph_VOL.bar(np.arange(0, len(df_stockload.index)), df_stockload.vol,color=['g' if df_stockload.open[x] > df_stockload.close[x] else 'r' for x in range(0,len(df_stockload.index))])\n",
    "graph_VOL.set_ylabel(u\"成交量\")\n",
    "graph_VOL.set_xlim(0,len(df_stockload.index)) #设置一下x轴的范围\n",
    "graph_VOL.set_xticks(range(0,len(df_stockload.index),15))#X轴刻度设定 每15天标一个日期"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f2b648a7",
   "metadata": {},
   "outputs": [],
   "source": [
    "#绘制MACD\n",
    "macd_dif, macd_dea, macd_bar = talib.MACD(df_stockload['close'].values, fastperiod=12, slowperiod=26, signalperiod=9)\n",
    "graph_MACD.plot(np.arange(0, len(df_stockload.index)), macd_dif, 'red', label='macd dif')  # dif\n",
    "graph_MACD.plot(np.arange(0, len(df_stockload.index)), macd_dea, 'blue', label='macd dea')  # dea\n",
    "\n",
    "bar_red = np.where(macd_bar > 0, 2 * macd_bar, 0)# 绘制BAR>0 柱状图\n",
    "bar_green = np.where(macd_bar < 0, 2 * macd_bar, 0)# 绘制BAR<0 柱状图\n",
    "graph_MACD.bar(np.arange(0, len(df_stockload.index)), bar_red, facecolor='red')\n",
    "graph_MACD.bar(np.arange(0, len(df_stockload.index)), bar_green, facecolor='green')\n",
    "\n",
    "graph_MACD.legend(loc='best',shadow=True, fontsize ='10')\n",
    "graph_MACD.set_ylabel(u\"MACD\")\n",
    "graph_MACD.set_xlim(0,len(df_stockload.index)) #设置一下x轴的范围\n",
    "graph_MACD.set_xticks(range(0,len(df_stockload.index),15))#X轴刻度设定 每15天标一个日期"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a24d2999",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "3311b4e2",
   "metadata": {},
   "outputs": [
    {
     "ename": "ImportError",
     "evalue": "cannot import name 'candlestick2_ochl' from 'matplotlib' (c:\\vnstudio\\lib\\site-packages\\matplotlib\\__init__.py)",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mImportError\u001b[0m                               Traceback (most recent call last)",
      "\u001b[1;32m~\\AppData\\Local\\Temp/ipykernel_18020/1011739924.py\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[0mmatplotlib\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mcandlestick2_ochl\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;31mImportError\u001b[0m: cannot import name 'candlestick2_ochl' from 'matplotlib' (c:\\vnstudio\\lib\\site-packages\\matplotlib\\__init__.py)"
     ]
    }
   ],
   "source": [
    "from matplotlib import candlestick2_ochl"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5f622547",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "207c767d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>vol</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>trade_date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1970-01-01 00:00:00.020190801</th>\n",
       "      <td>14.06</td>\n",
       "      <td>14.19</td>\n",
       "      <td>13.94</td>\n",
       "      <td>14.10</td>\n",
       "      <td>527981.28</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1970-01-01 00:00:00.020190802</th>\n",
       "      <td>13.77</td>\n",
       "      <td>13.88</td>\n",
       "      <td>13.66</td>\n",
       "      <td>13.74</td>\n",
       "      <td>969926.46</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1970-01-01 00:00:00.020190805</th>\n",
       "      <td>13.60</td>\n",
       "      <td>13.64</td>\n",
       "      <td>13.27</td>\n",
       "      <td>13.35</td>\n",
       "      <td>893082.42</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1970-01-01 00:00:00.020190806</th>\n",
       "      <td>13.10</td>\n",
       "      <td>13.46</td>\n",
       "      <td>13.03</td>\n",
       "      <td>13.37</td>\n",
       "      <td>882499.13</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1970-01-01 00:00:00.020190807</th>\n",
       "      <td>13.49</td>\n",
       "      <td>13.64</td>\n",
       "      <td>13.37</td>\n",
       "      <td>13.54</td>\n",
       "      <td>793038.99</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1970-01-01 00:00:00.020200327</th>\n",
       "      <td>13.25</td>\n",
       "      <td>13.38</td>\n",
       "      <td>13.08</td>\n",
       "      <td>13.15</td>\n",
       "      <td>653018.88</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1970-01-01 00:00:00.020200330</th>\n",
       "      <td>12.85</td>\n",
       "      <td>13.04</td>\n",
       "      <td>12.76</td>\n",
       "      <td>12.94</td>\n",
       "      <td>661738.79</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1970-01-01 00:00:00.020200331</th>\n",
       "      <td>13.05</td>\n",
       "      <td>13.09</td>\n",
       "      <td>12.78</td>\n",
       "      <td>12.80</td>\n",
       "      <td>513370.30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1970-01-01 00:00:00.020200401</th>\n",
       "      <td>12.86</td>\n",
       "      <td>13.13</td>\n",
       "      <td>12.82</td>\n",
       "      <td>12.89</td>\n",
       "      <td>520836.04</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1970-01-01 00:00:00.020200402</th>\n",
       "      <td>12.75</td>\n",
       "      <td>12.97</td>\n",
       "      <td>12.66</td>\n",
       "      <td>12.97</td>\n",
       "      <td>518365.04</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>163 rows × 5 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                                open   high    low  close        vol\n",
       "trade_date                                                          \n",
       "1970-01-01 00:00:00.020190801  14.06  14.19  13.94  14.10  527981.28\n",
       "1970-01-01 00:00:00.020190802  13.77  13.88  13.66  13.74  969926.46\n",
       "1970-01-01 00:00:00.020190805  13.60  13.64  13.27  13.35  893082.42\n",
       "1970-01-01 00:00:00.020190806  13.10  13.46  13.03  13.37  882499.13\n",
       "1970-01-01 00:00:00.020190807  13.49  13.64  13.37  13.54  793038.99\n",
       "...                              ...    ...    ...    ...        ...\n",
       "1970-01-01 00:00:00.020200327  13.25  13.38  13.08  13.15  653018.88\n",
       "1970-01-01 00:00:00.020200330  12.85  13.04  12.76  12.94  661738.79\n",
       "1970-01-01 00:00:00.020200331  13.05  13.09  12.78  12.80  513370.30\n",
       "1970-01-01 00:00:00.020200401  12.86  13.13  12.82  12.89  520836.04\n",
       "1970-01-01 00:00:00.020200402  12.75  12.97  12.66  12.97  518365.04\n",
       "\n",
       "[163 rows x 5 columns]"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_stockload"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a80da242",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
